<!doctype html><html lang=en-us><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="基本信息  官网 介绍：一种支持多种语言的调试器。  基础知识 使用 gdb 调试 C 程序时，建议在程序编译时加入调试符号信息 -g 选项。
gdb a.out 可以使用 --tui 选项进入终端用户界面图形化调试。Ctrl + X + A 切换 TUI 和传统模式。
   命令 描述     help h 帮助   quit q 退出    查看程序 list 或 l：查看源代码。
list -5 # show line 5 list func # show func disassemble 查看汇编码。
/m # 源码和汇编一起排列 /r # 显示16进制代码 disassemble /m main 布局 layout 命令用于分割窗口，可以一边查看代码，一边测试。"><title>GDB - The GNU Project Debugger</title><link rel=canonical href=https://stardustdl.gitee.io/posts/tools/gdb/><link rel=stylesheet href=/scss/style.min.css><meta property="og:title" content="GDB - The GNU Project Debugger"><meta property="og:description" content="基本信息  官网 介绍：一种支持多种语言的调试器。  基础知识 使用 gdb 调试 C 程序时，建议在程序编译时加入调试符号信息 -g 选项。
gdb a.out 可以使用 --tui 选项进入终端用户界面图形化调试。Ctrl + X + A 切换 TUI 和传统模式。
   命令 描述     help h 帮助   quit q 退出    查看程序 list 或 l：查看源代码。
list -5 # show line 5 list func # show func disassemble 查看汇编码。
/m # 源码和汇编一起排列 /r # 显示16进制代码 disassemble /m main 布局 layout 命令用于分割窗口，可以一边查看代码，一边测试。"><meta property="og:url" content="https://stardustdl.gitee.io/posts/tools/gdb/"><meta property="og:site_name" content="StardustDL's Blog"><meta property="og:type" content="article"><meta property="article:section" content="Posts"><meta property="article:published_time" content="2018-09-27T18:58:19+08:00"><meta property="article:modified_time" content="2018-09-27T18:58:19+08:00"><meta name=twitter:title content="GDB - The GNU Project Debugger"><meta name=twitter:description content="基本信息  官网 介绍：一种支持多种语言的调试器。  基础知识 使用 gdb 调试 C 程序时，建议在程序编译时加入调试符号信息 -g 选项。
gdb a.out 可以使用 --tui 选项进入终端用户界面图形化调试。Ctrl + X + A 切换 TUI 和传统模式。
   命令 描述     help h 帮助   quit q 退出    查看程序 list 或 l：查看源代码。
list -5 # show line 5 list func # show func disassemble 查看汇编码。
/m # 源码和汇编一起排列 /r # 显示16进制代码 disassemble /m main 布局 layout 命令用于分割窗口，可以一边查看代码，一边测试。"><link rel="shortcut icon" href=/favicon.png><script type=application/javascript>var doNotTrack=!1;doNotTrack||(function(a,e,f,g,b,c,d){a.GoogleAnalyticsObject=b,a[b]=a[b]||function(){(a[b].q=a[b].q||[]).push(arguments)},a[b].l=1*new Date,c=e.createElement(f),d=e.getElementsByTagName(f)[0],c.async=1,c.src=g,d.parentNode.insertBefore(c,d)}(window,document,'script','https://www.google-analytics.com/analytics.js','ga'),ga('create','UA-111573521-1','auto'),ga('send','pageview'))</script></head><body class="article-page has-toc"><script>(function(){const a='StackColorScheme';localStorage.getItem(a)||localStorage.setItem(a,"auto")})()</script><script>(function(){const b='StackColorScheme',a=localStorage.getItem(b),c=window.matchMedia('(prefers-color-scheme: dark)').matches===!0;a=='dark'||a==='auto'&&c?document.documentElement.dataset.scheme='dark':document.documentElement.dataset.scheme='light'})()</script><div class="container main-container flex
extended"><div id=article-toolbar><a href=/ class=back-home><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><polyline points="15 6 9 12 15 18"/></svg><span>Back</span></a></div><main class="main full-width"><article class=main-article><header class=article-header><div class=article-details><header class=article-category><a href=/categories/tools/>Tools</a></header><h2 class=article-title><a href=/posts/tools/gdb/>GDB - The GNU Project Debugger</a></h2><footer class=article-time><div><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-calendar-time" width="56" height="56" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><path d="M11.795 21H5a2 2 0 01-2-2V7a2 2 0 012-2h12a2 2 0 012 2v4"/><circle cx="18" cy="18" r="4"/><path d="M15 3v4"/><path d="M7 3v4"/><path d="M3 11h16"/><path d="M18 16.496V18l1 1"/></svg><time class=article-time--published>Sep 27, 2018</time></div><div><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 15 15"/></svg><time class=article-time--reading>1 minute read</time></div></footer></div></header><section class=article-content><h1 id=基本信息>基本信息</h1><ul><li><a class=link href=http://www.gnu.org/software/gdb/ target=_blank rel=noopener>官网</a></li><li>介绍：一种支持多种语言的调试器。</li></ul><h1 id=基础知识>基础知识</h1><p>使用 gdb 调试 C 程序时，建议在程序编译时加入调试符号信息 <code>-g</code> 选项。</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>gdb a.out
</code></pre></div><p>可以使用 <code>--tui</code> 选项进入终端用户界面图形化调试。<code>Ctrl + X</code> + <code>A</code> 切换 TUI 和传统模式。</p><table><thead><tr><th>命令</th><th>描述</th></tr></thead><tbody><tr><td><code>help h</code></td><td>帮助</td></tr><tr><td><code>quit q</code></td><td>退出</td></tr></tbody></table><h1 id=查看程序>查看程序</h1><p><code>list</code> 或 <code>l</code>：查看源代码。</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>list -5 <span class=c1># show line 5</span>
list func <span class=c1># show func</span>
</code></pre></div><p><code>disassemble</code> 查看汇编码。</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>/m <span class=c1># 源码和汇编一起排列</span>
/r <span class=c1># 显示16进制代码</span>

disassemble /m main
</code></pre></div><h1 id=布局>布局</h1><p><code>layout</code> 命令用于分割窗口，可以一边查看代码，一边测试。</p><ul><li><code>layout src</code> 显示源代码窗口</li><li><code>layout asm</code> 显示汇编窗口</li><li><code>layout regs</code> 显示源代码/汇编和寄存器窗口</li><li><code>layout split</code> 显示源代码和汇编窗口</li><li><code>layout next</code> 显示下一个layout</li><li><code>layout prev</code> 显示上一个layout</li><li><code>Ctrl + L</code> 刷新窗口</li><li><code>Ctrl + x</code> 再按1 单窗口模式，显示一个窗口</li><li><code>Ctrl + x</code> 再按2 双窗口模式，显示两个窗口</li><li><code>Ctrl + x</code> 再按a 回到传统模式，即退出layout，回到执行layout之前的调试窗口。</li></ul><h1 id=运行程序>运行程序</h1><table><thead><tr><th>命令</th><th>描述</th></tr></thead><tbody><tr><td><code>run r</code></td><td>重新开始运行文件，可以带参数</td></tr><tr><td><code>start</code></td><td>单步执行，运行程序，停在第一执行语句</td></tr><tr><td><code>next n</code></td><td>单步调试（逐过程，函数直接执行）</td></tr><tr><td><code>step s</code></td><td>单步调试（逐语句：跳入自定义函数内部执行）</td></tr><tr><td><code>nexti ni</code></td><td>单步调试（逐指令，即汇编语句，函数直接执行）</td></tr><tr><td><code>stepi si</code></td><td>单步调试（逐指令，即汇编语句跳入自定义函数内部执行）</td></tr><tr><td><code>continue c</code></td><td>继续运行</td></tr><tr><td><code>finish</code></td><td>结束当前函数，返回到函数调用点</td></tr></tbody></table><h1 id=处理运行时信息>处理运行时信息</h1><h2 id=查看变量>查看变量</h2><p><code>print</code> 或 <code>p</code> 用于查看变量（表达式），也可以查看寄存器的值（<code>$eax $ebx</code>）</p><p><code>info</code> 或 <code>i</code> 查看函数内部局部变量的数值。</p><h2 id=设置变量>设置变量</h2><p><code>set</code> 设置变量的值。</p><h2 id=查看内存>查看内存</h2><p><code>x</code> 命令用于查看内存。</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>x/20xw &lt;addr&gt; <span class=c1># 显示20个单元，16进制，4字节每单元</span>
</code></pre></div><p><code>x/i</code> 查看指令。<code>$pc</code> 指向当前程序运行地址</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh>x/15i main
</code></pre></div><h2 id=查看函数调用栈>查看函数调用栈</h2><p><code>backtrace</code> 或 <code>bt</code> 查看函数的调用的栈帧和层级关系。</p><h2 id=切换函数栈帧>切换函数栈帧</h2><p><code>frame</code> 或 <code>f</code> 切换函数的栈帧。</p><h2 id=追踪变量>追踪变量</h2><p><code>display</code> 追踪查看具体变量值。
<code>undisplay</code> 取消追踪观察变量。</p><h2 id=监视变量>监视变量</h2><p><code>watch</code> 被设置观察点的变量（表达式）发生修改时，打印显示。
<code>info watch</code> 显示观察点</p><h1 id=断点>断点</h1><h2 id=设置断点>设置断点</h2><p><code>break</code> 或 <code>b</code> 设置断点。</p><div class=highlight><pre class=chroma><code class=language-sh data-lang=sh><span class=nb>break</span> <span class=m>10</span> <span class=c1># at line 10</span>
<span class=nb>break</span> *&lt;addr&gt; <span class=c1># at the instruction at addr</span>
<span class=nb>break</span> func <span class=c1># at function</span>
</code></pre></div><p><code>enable breakpoints</code> 启用断点。
<code>disable breakpoints</code> 禁用断点。</p><h2 id=查看断点>查看断点</h2><p><code>info breakpoints</code> 查看当前设置的所有断点</p><h2 id=删除断点>删除断点</h2><p><code>delete breakpoints &lt;num></code> 删除第num个断点,简写 <code>d</code></p><h1 id=参考资料>参考资料</h1><p>暂无</p></section><footer class=article-footer><section class=article-copyright><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-copyright" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><circle cx="12" cy="12" r="9"/><path d="M14.5 9a3.5 4 0 100 6"/></svg><span>Licensed under CC BY-NC-SA 4.0</span></section></footer><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.css integrity=sha384-RZU/ijkSsFbcmivfdRBQDtwuwVqK7GMOw6IMvKyeWL2K5UAlyp6WonmB8m7Jd0Hn crossorigin=anonymous><script src=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/katex.min.js integrity=sha384-pK1WpvzWVBQiP0/GjnvRxV4mOb0oxFuyRxJlk6vVw146n3egcN5C925NCP7a7BY8 crossorigin=anonymous defer></script><script src=https://cdn.jsdelivr.net/npm/katex@0.13.13/dist/contrib/auto-render.min.js integrity=sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl crossorigin=anonymous defer></script><script>window.addEventListener("DOMContentLoaded",()=>{renderMathInElement(document.querySelector(`.article-content`),{delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}]})})</script></article><aside class=related-contents--wrapper><h2 class=section-title>Related contents</h2><div class=related-contents><div class="flex article-list--tile"><article><a href=/posts/tools/psake/><div class=article-details><h2 class=article-title>psake</h2></div></a></article><article><a href=/posts/tools/github-workflow/><div class=article-details><h2 class=article-title>GitHub Actions - Workflow</h2></div></a></article><article><a href=/posts/tools/proglang-dockerfile/><div class=article-details><h2 class=article-title>Dockerfile</h2></div></a></article><article class=has-image><a href=/posts/tools/proglang-yaml/><div class=article-image><img src=https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/yaml/yaml.png loading=lazy data-key data-hash=https://raw.githubusercontent.com/github/explore/80688e429a7d4ef2fca1e82350fe8e3517d3494d/topics/yaml/yaml.png></div><div class=article-details><h2 class=article-title>YAML Ain't Markup Language</h2></div></a></article><article class=has-image><a href=/posts/tools/powershell/><div class=article-image><img src=https://devblogs.microsoft.com/powershell/wp-content/uploads/sites/30/2018/09/Powershell_256.png loading=lazy data-key data-hash=https://devblogs.microsoft.com/powershell/wp-content/uploads/sites/30/2018/09/Powershell_256.png></div><div class=article-details><h2 class=article-title>PowerShell</h2></div></a></article></div></div></aside><script src=https://utteranc.es/client.js repo=StardustDL/stardustdl.github.io issue-term=pathname label=comment crossorigin=anonymous async></script><style>.utterances{max-width:unset}</style><script>function setUtterancesTheme(b){let a=document.querySelector('.utterances iframe');a&&a.contentWindow.postMessage({type:'set-theme',theme:`github-${b}`},'https://utteranc.es')}addEventListener('message',a=>{if(a.origin!=='https://utteranc.es')return;setUtterancesTheme(document.documentElement.dataset.scheme)}),window.addEventListener('onColorSchemeChange',a=>{setUtterancesTheme(a.detail)})</script><footer class=site-footer><section class=copyright>&copy;
2017 -
2021 StardustDL's Blog</section><section class=powerby><a style=color:gray href=http://www.beian.miit.gov.cn>冀ICP备19021004号</a><br>Built with <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a><br>Theme <b><a href=https://github.com/CaiJimmy/hugo-theme-stack target=_blank rel=noopener data-version=3.5.0>Stack</a></b> designed by <a href=https://jimmycai.com target=_blank rel=noopener>Jimmy</a></section></footer><div class=pswp tabindex=-1 role=dialog aria-hidden=true><div class=pswp__bg></div><div class=pswp__scroll-wrap><div class=pswp__container><div class=pswp__item></div><div class=pswp__item></div><div class=pswp__item></div></div><div class="pswp__ui pswp__ui--hidden"><div class=pswp__top-bar><div class=pswp__counter></div><button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" title=Share></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button><div class=pswp__preloader><div class=pswp__preloader__icn><div class=pswp__preloader__cut><div class=pswp__preloader__donut></div></div></div></div></div><div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class=pswp__share-tooltip></div></div><button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"></button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"></button><div class=pswp__caption><div class=pswp__caption__center></div></div></div></div></div><script src=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js integrity="sha256-ePwmChbbvXbsO02lbM3HoHbSHTHFAeChekF1xKJdleo=" crossorigin=anonymous defer></script><script src=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js integrity="sha256-UKkzOn/w1mBxRmLLGrSeyB4e1xbrp4xylgAWb3M42pU=" crossorigin=anonymous defer></script><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.css integrity="sha256-c0uckgykQ9v5k+IqViZOZKc47Jn7KQil4/MP3ySA3F8=" crossorigin=anonymous><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.css integrity="sha256-SBLU4vv6CA6lHsZ1XyTdhyjJxCjPif/TRkjnsyGAGnE=" crossorigin=anonymous></main><aside class="sidebar right-sidebar sticky"><section class="widget archives"><div class=widget-icon><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentcolor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z"/><line x1="5" y1="9" x2="19" y2="9"/><line x1="5" y1="15" x2="19" y2="15"/><line x1="11" y1="4" x2="7" y2="20"/><line x1="17" y1="4" x2="13" y2="20"/></svg></div><h2 class="widget-title section-title">Table of contents</h2><div class=widget--toc><nav id=TableOfContents><ol><li><a href=#基本信息>基本信息</a></li><li><a href=#基础知识>基础知识</a></li><li><a href=#查看程序>查看程序</a></li><li><a href=#布局>布局</a></li><li><a href=#运行程序>运行程序</a></li><li><a href=#处理运行时信息>处理运行时信息</a><ol><li><a href=#查看变量>查看变量</a></li><li><a href=#设置变量>设置变量</a></li><li><a href=#查看内存>查看内存</a></li><li><a href=#查看函数调用栈>查看函数调用栈</a></li><li><a href=#切换函数栈帧>切换函数栈帧</a></li><li><a href=#追踪变量>追踪变量</a></li><li><a href=#监视变量>监视变量</a></li></ol></li><li><a href=#断点>断点</a><ol><li><a href=#设置断点>设置断点</a></li><li><a href=#查看断点>查看断点</a></li><li><a href=#删除断点>删除断点</a></li></ol></li><li><a href=#参考资料>参考资料</a></li></ol></nav></div></section></aside></div><script src=https://cdn.jsdelivr.net/npm/node-vibrant@3.1.5/dist/vibrant.min.js integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g=" crossorigin=anonymous defer></script><script type=text/javascript src=/ts/main.js defer></script><script>(function(){const a=document.createElement('link');a.href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&display=swap",a.type="text/css",a.rel="stylesheet",document.head.appendChild(a)})()</script></body></html>